package controllers.interfaces;
import java.util.Collection;

import contract.EventContract;

import budget.Budget;

public interface BudgetController {
	/**
	 * <h1>Ottenere i preventivi</h1>
	 * Questo metodo viene chiamato nel caso in cui venga richiesto di visualizzare tutti i preventivi
	 * visualizzabili dall' utente loggato
	 * <h2>Tutto � andato a buon fine</h2>
	 * l'utente visualizzerˆ i preventivi ritornati sotto forma di moduli.
	 * <h2>Se qualcosa va storto</h2>
	 * In questo caso non bisogna esitare a lanciare un eccezione con tanto di messaggio di errore
	 * che sarˆ visualizzato a video dall' utente che sarˆ riportato alla <b>SpringBoard</b>
	 * <h2>Parametri ed eccezioni</h2>
	 *  @param searchTerms String termini di ricerca gestiti dal controller
	 * */
	public Collection<Budget> getBudgets(String searchTerms)throws Exception;
	/**
	 * <h1>Inviare un preventivo</h1>
	 * Questo metodo viene chiamato nel caso in cui venga richiesto di inviare un preventivo
	 * <h2>Tutto � andato a buon fine</h2>
	 * Il preventivo diventa contratto e non viene pi� visualizzato nella schermata dei 
	 * preventivi, bensi in quella dei contratti
	 * <h2>Se qualcosa va storto</h2>
	 * Il preventivo non viene alterato ed � necessario lanciare un eccezione che sarˆ stampata a video.
	 * <h2>Parametri ed eccezioni</h2>
	 *  @param budget Budget il preventivo da inviare
	 * */
	public EventContract acceptBudget(Budget budget)throws Exception;
	/**
	 * <h1>Modifica del preventiv</h1>
	 * Questo metodo viene chiamato nel caso in cui venga richiesto di salvare e non inviare il preventivo
	 * quando questo metodo viene chiamato c si aspetta che venga aggiornato anche il totale in modo tale
	 * da permettere all' utente di visualizzare il costo totale dei servizi e delle correzioni.
	 * <h2>Tutto � andato a buon fine</h2>
	 * Il totale viene aggiornato.
	 * <h2>Se qualcosa va storto</h2>
	 * In questo caso non bisogna esitare a lanciare un eccezione con tanto di messaggio di errore
	 * che sarˆ visualizzato a video dall' utente.
	 * <h2>Parametri ed eccezioni</h2>
	 *  @param budget Budget preventivo da salvare/calcolare
	 * */
	public void modifyBudget(Budget budget) throws Exception;
	/**
	 * <h1>rimuovere un preventivo</h1>
	 * Questo metodo viene chiamato nel caso in cui venga richiesto di rimuovere un preventivo
	 * <h2>Nota</h2>
	 * Eliminando il preventivo sarˆ eliminata anche la richiesta e l'evento collegati a quest' ultimo
	 * <h2>Tutto � andato a buon fine</h2>
	 * il preventivo eliminato non sarˆ visualizzato da nessuno.
	 * <h2>Se qualcosa va storto</h2>
	 * In questo caso non bisogna esitare a lanciare un eccezione con tanto di messaggio di errore
	 * che sarˆ visualizzato a video ed il preventivo non sarˆ toccato (possibilmente)
	 * <h2>Parametri ed eccezioni</h2>
	 *  @param budget Budget preventivo da eliminare
	 * */
	public void removeBudget(Budget budget)throws Exception;
}
